package com.yoyo.itravel.utils;

import java.lang.reflect.Field;
import java.util.Map;

/**
 * @author HZX
 * @Description 实体工具类
 * @date 2020年4月10日 上午11:54:47
 */
public class BeanUtils {

    /**
     * @Description 私有化构造器
     */
    private BeanUtils() {

    }

    /**
     * @param <K>
     * @param <V>
     * @param clazz
     * @param map
     * @return
     * @Description 将map中的值赋值到相应实体类的属性中
     */
    public static <T, K, V> T populate(Class<T> clazz, Map<K, V[]> map) {

        // 判断clazz是否为null
        if (clazz == null) {
            return null;
        }

        try {
            // 构建相应实体类对象
            T obj = clazz.newInstance();

            if (map != null) {
                // 遍历map集合
                for (Map.Entry<K, V[]> entry : map.entrySet()) {
                    if (entry == null) {
                        continue;
                    }
                    // 获得key--属性名
                    String propertyName = (String) entry.getKey();
                    // 获得value--属性值
                    V[] propertyValue = entry.getValue();
                    // 通过传入的属性名称获得实体类对象对应的字段对象
                    Field field = obj.getClass().getDeclaredField(propertyName);
                    if (field == null || propertyValue == null) {
                        continue;
                    }
                    // 将访问权限设为true--暴力反射
                    field.setAccessible(true);

                    // 赋值对应的属性值
                    if (propertyValue.length == 1) {
                        field.set(obj, propertyValue[0]);
                    } else {
                        field.set(obj, propertyValue);
                    }
                }
            }

            // 返回
            return obj;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        // 返回
        return null;
    }

}
